package com.itheima.service.db.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.itheima.domain.db.BackGround;
import com.itheima.domain.db.Token;
import com.itheima.domain.db.WeChatUser;
import com.itheima.mapper.BackGroundMapper;
import com.itheima.mapper.WeChatUserMapper;
import com.itheima.service.db.WeChatUserService;
import com.itheima.utils.HttpClientUtil;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import java.util.HashMap;
import java.util.Map;

@Service
public class WeChatUserServiceImpl implements WeChatUserService {

    @Autowired
    private WeChatUserMapper weChatUserMapper;

    @Autowired
    private BackGroundMapper backGroundMapper;


    //private

    @Value("${wx.appid}")
    private String appid;


    @Value("${wx.secret}")
    private String secret;


    @Value("${wx.accessTokenUrl}")
    private String accessTokenUrl;

    @Value("${wx.wxInfoUrl}")
    private String wxInfoUrl;



//https://api.weixin.qq.com/sns/oauth2/  access_token? appid=APPID&secret=SECRET& code=CODE  &grant_type=authorization_code

    //流程
    //扫码后前台会传一个code =>将URL前缀,账号,密码和code拼接起来 可以获得一个Json串
    //通过Json将Json串封装到一个实体类 此实体类也是官方提供的实体类   Token类
    //通过实体类中的 access_token和openid  拼接上 回调URL https://api.weixin.qq.com/sns/userinfo,又可以获得到一个用户信息的Json串
    //再通过Json将这个Json串封装到一个对象中(也是官方提供的) WeChatUser
    //这个对象 就有微信用户的信息了 WeChatUser
    public String wxLogin(String code) {

        //1.扫码后前台会传一个code  将URL前缀,账号,密码和code拼接起来 使用工具类拼接
        Map<String, String> params = new HashMap<>();
        params.put("appid", appid);
        params.put("secret", secret);
        params.put("code", code);
        params.put("grant_type", "authorization_code");

        //2.使用工具类拼接 会返回一个微信凭证的Json串             此串包含的参数都定义到了下面的Token实体类中
        String tokenString = HttpClientUtil.doGet(accessTokenUrl, params);
        //通过Json将Json串封装到一个实体类
        Token token = JSON.parseObject(tokenString, Token.class);

        //3.通过access_token与openid+拼接回调URL 又会返回一个用户信息的Json串
        String userInfo = HttpClientUtil.doGet(wxInfoUrl + "?access_token=" + token.getAccess_token() + "&openid=" + token.getOpenid());

        //4.将用户信息的Json串封装到实体类   获取微信用户信息
        WeChatUser weChatUser = JSON.parseObject(userInfo, WeChatUser.class);
        System.out.println("微信用户信息:"+weChatUser);



        // ===== 获取了用户信息后，执行我们的流程业务 ========
        //获取微信用户信息中的 普通用户的标识openid
        String openid = weChatUser.getOpenid();
        System.out.println("===============>>>>>" + openid);


        //通过openid查询微信表数据
        QueryWrapper wrapper2 = new QueryWrapper();
        wrapper2.eq("openid", openid);
        WeChatUser weChatUser1 = weChatUserMapper.selectOne(wrapper2);
        //如果没查到 新增  如果有就不用管了 避免第二次扫码出现重复数据
        if (weChatUser1 == null) {
            weChatUserMapper.insert(weChatUser);
        }




        //通过openid查询zijian表数据
        QueryWrapper wrapper = new QueryWrapper();
        wrapper.eq("openid", openid);
        BackGround backGround =backGroundMapper.selectOne(wrapper);


        System.out.println("backGround后台对象是：" + backGround);

        //如果数据库没有此用户  代表他扫完码查zijian库查不到它的信息 那么跳转到 手动登入页面
        if (backGround == null) {
            System.out.println("1111111");

            //如果没有 跳转到主页手动输入账号密码进入
            String indexUrl2 = "/login/login.html";                //待修改主页的html


            //返回跳转页面字符串
            return indexUrl2;

        } else {
            //如果不是空  代表他是管理员 并且将微信用户信息保存到数据库中


            //扫码的用户是管理员 并跳转到后台主页
            String indexUrl = "/backstage/admin/index/index.html";              //待修改后台主页

            //返回跳转页面字符串
            return indexUrl;
        }

    }


    //根据用户名和密码 查询后台表
    @Override
    public String login(String admin, String pwd) {
        //创建条件
        QueryWrapper wrapper = new QueryWrapper();
        wrapper.eq("username", admin);
        wrapper.eq("password", pwd);

        //查询
        BackGround backGround = backGroundMapper.selectOne(wrapper);


        //如果可以查出来那么代表输入的账号密码正确 响应跳转后台提示  查出为空代表输入错误
        if (backGround == null) {
            return "1";
        } else {
            return "ok";
        }

    }

}
